package logica;

import java.util.ArrayList;
import java.util.Collection;
import mapa.Coordenada;
import unidades.UnidadHT;

public class AccionMovimiento implements Accion {

    public static final int POSICION_INICIAL = 0;
    public static final int POSICION_FINAL = 1;

    /**
     * Crea una accion de movimiento para mover la unidad. Su ejecución devolverá 
     * List<Coordenada> con la posición inicial y final.
     * Se pueden obtener los datos mediante los atributos estáticos de esta clase 
     * de la siguiente forma: nombredelacollection.get(AccionMovimiento.POSICION_INICIAL);
     */
    public AccionMovimiento() {
    }

    /**
     * Realiza el movimiento de la unidad si se puede. Devuelve la nueva coordenada o null
     * 
     * @param args Array con los argumentos necesarios. 
     * Debe recibir los parámetros en el siguiente orden:
     * <ol><li>ModeloHT</li>
     * <li>UnidadHT</li>
     * <li>Collection<Coordenada> rangoMovimiento</li>
     * <li>Collection<Coordenada> rangoAtaque</li>
     * <li>Coordenada</li></ol>
     * @return List<Coordenada> con la posición inicial y final
     */
    public Object ejecutarAccion(Object... args) {
        ModeloHT modelo = (ModeloHT) args[0];
        UnidadHT unidadActual = (UnidadHT) args[1];
        Collection<Coordenada> rangoMovActual = (Collection<Coordenada>) args[2];
        Coordenada crdnd = (Coordenada) args[4];
        if (rangoMovActual.isEmpty()) {
            throw new NullPointerException("No se ha establecido el rango de movimiento de la unidad");
        }
        if (!unidadActual.puedeMover()) {
            throw new IllegalStateException("La unidad actual no puede mover porque ya ha realizado otra acción");
        }
        if (modelo.getPartida().getTurno().getPuntosAccion() <= 0) {
            return null;
        }
        if (rangoMovActual.contains(crdnd)) {
            ArrayList<Coordenada> coords = new ArrayList<Coordenada>();
            coords.add(unidadActual.getPosicion());
            modelo.getPartida().getMapa().getUnidades()[unidadActual.getPosicion().getX()][unidadActual.getPosicion().getY()] = null;
            modelo.getPartida().getMapa().getUnidades()[crdnd.getX()][crdnd.getY()] = unidadActual;
            unidadActual.setPosicion(crdnd);
            unidadActual.movido();
            rangoMovActual.clear();
            coords.add(crdnd);
            modelo.actualizarTurno();
            return coords;
        } else {
            return null;
        }
    }
}
